/**
 * Created by TianJing on 2017/2/7.
 */
// 百度地图API功能
function MapController() {
    this.circle="";
    this.currentPlace="";
    this.aroundInfo=[];
    this.getElement=function (id) {
        return document.getElementById(id);
    };
}
MapController.prototype={
    getPositionByBaiDuApi:function (options) {
        var self=this;//this指向调用者
        var cityName=options.cityName||"上海";
        var initPosition=options.initPosition||[];
        var initSearchText=options.initSearchText||"";
        var $lng=$("#longitude");
        var $lat=$("#latitude");
        var $suggestId=$("#suggestId");
        function G(id) {
            return document.getElementById(id);
        }
        initSearchText=initSearchText ||"";
        //检测百度地图是否已加载进来
        if(!!window.BMap){
            var map = new BMap.Map("l-map");
            map.enableScrollWheelZoom(true);   //允许鼠标滚动缩放地图
            var draggedPoint={};//声明被拖拽图标（marker）的坐标对象
            var marker="";//声明标记点为全局变量
            if($.isArray(initPosition) && !!initPosition.length){
                //如果参数是一个有值的数组，那么就说明已经获取到了准确的经纬度
                initPosition=new BMap.Point(initPosition[0], initPosition[1]);
                map.centerAndZoom(initPosition,20);//初始化地图中心的显示位置
                marker= new BMap.Marker(initPosition);// 初始化标记点的坐标
                // marker.setAnimation(BMAP_ANIMATION_BOUNCE); //点图标跳动
                map.addOverlay(marker);              // 将标注添加到地图中
                marker.addEventListener("mouseup",function(){
                    var p = marker.getPosition();  //当鼠标上手指抬起时获取marker的位置
                    draggedPoint=p;//被拖拽图标的坐标对象赋值
                });
                //默认根据当前坐标点搜索附近地铁信息，搜索半径为1000m
                self.aroundSearch({
                    searchWord:'地铁',
                    map:map,
                    point:initPosition,
                    radius:1000
                });
            }else{
                //如果参数内没有传入初始化坐标点，那就定位到城市地图，地图级别为12级
                map.centerAndZoom(cityName,12);
            }                   // 初始化地图,设置城市和地图级别。
            //编辑地图坐标点功能，理论上应该拉出去做一个单独的回调，目前由于工作周期原因暂搁
            // 需要调用该方法的开发人员在HTML的DOM结构中使用指定id和类名来标签命名
            var $positionBtn=$("#map-box").find(".btn");
            $positionBtn.off("click").on("click",function () {
                var $this=$(this);
                if($this.hasClass("positionEdit")){
                    marker.enableDragging();    //坐标点图标可以拖拽
                    $positionBtn.removeClass("positionEdit").addClass("positionStorage").html("保存位置");
                }else if($this.hasClass("positionStorage")){
                    //赋值
                    $lng.val(draggedPoint.lng)&&$lat.val(draggedPoint.lat); //刷新表单内坐标点的值
                    marker.disableDragging();    //禁止坐标点图标拖拽
                    $positionBtn.removeClass("positionStorage").addClass("positionEdit").html("编辑位置");
                    //点击保存位置以后，调用本地搜索方法，基于拖拽后产生的新坐标点搜索，搜索半径 radius 为1000m
                    self.aroundSearch({
                        searchWord:'地铁',
                        map:map,
                        point:draggedPoint,
                        radius:1000
                    });
                }
            });
            var ac = new BMap.Autocomplete(    //建立一个自动完成的对象
                {   "input" : G("suggestId"),
                    "location" : map
                });
            !!initSearchText?ac.setInputValue(initSearchText):null;
            ac.addEventListener("onhighlight", function(e) {  //鼠标放在下拉列表上的事件
                var str = "";
                var _value = e.fromitem.value;
                var value = "";
                if (e.fromitem.index > -1) {
                    value = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
                }
                str = "FromItem<br />index = " + e.fromitem.index + "<br />value = " + value;

                value = "";
                if (e.toitem.index > -1) {
                    _value = e.toitem.value;
                    value = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
                }
                str += "<br />ToItem<br />index = " + e.toitem.index + "<br />value = " + value;
                G("searchResultPanel").innerHTML = str;
            });

            var myValue;
            ac.addEventListener("onconfirm", function(e) {    //鼠标点击下拉列表后的事件
                var _value = e.item.value;
                myValue = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
                G("searchResultPanel").innerHTML ="onconfirm<br />index = " + e.item.index + "<br />myValue = " + myValue;
                $positionBtn.show();
                setPlace();
            });
            //搜索框失去焦点后，判断搜索框内是否还有内容，如果为空，就清空表单内的坐标控件的value
            $suggestId.on("blur",function () {
                if(!$suggestId.val()){
                    $lng.val("");
                    $lat.val("");
                }
            });
            //noinspection JSAnnotator
            function setPlace(){
                map.clearOverlays();    //清除地图上所有覆盖物
                var pp="";
                function myFun(){
                    pp = local.getResults().getPoi(0).point;    //获取第一个智能搜索的结果
                    map.centerAndZoom(pp, 16);
                    $lng.val(pp.lng);
                    $lat.val(pp.lat);
                    marker = new BMap.Marker(pp);
                    map.addOverlay(marker);    //添加标注
                    // marker.setAnimation(BMAP_ANIMATION_BOUNCE); //点图标跳动
                    //点图标 绑定事件，当鼠标抬起时获取此时 点 的坐标
                    marker.addEventListener("mouseup",function(){
                        var p = marker.getPosition();  //获取marker的位置
                        draggedPoint=p;
                    });
                    //本地搜索，基于当前坐标点搜索半径为1000m的地铁信息，由于在该方法内定义搜索热词默认是地铁，所以可以不传入searchWord
                    self.aroundSearch({
                        map:map,
                        point:pp,
                        radius:1000
                    });
                }
                var local = new BMap.LocalSearch(map, { //智能搜索
                    onSearchComplete: myFun
                });
                local.search(myValue);

            }
        }else{
            // console.log("百度地图未加载");
        }
    },
    aroundSearch:function (options) {
        var self=this;
        var map=options['map'],
            point=options['point'],
            searchWord=options['searchWord']||['地铁'],
            radius=options['radius'];
        !!self.circle?map.removeOverlay(self.circle):null;//每次搜索都要先清空上一次的搜索结果
        !!self.currentPlace?self.currentPlace.clearResults():null;//每次搜索都要先清空上一次的搜索条件
        //重新设置搜索半径
        self.circle = new BMap.Circle(point,radius,{fillColor:"blue", strokeWeight: 1 ,fillOpacity: 0.3, strokeOpacity: 0.3});
        map.addOverlay(self.circle);//搜索半径在地图上显示
        //本地搜索的配置
        self.currentPlace=new BMap.LocalSearch(map, {
            renderOptions: {map: map, autoViewport: false},
            onSearchComplete:function (result) {
                result=$.isArray(result)?result[0]:result;
                var resultObj={
                    total:result.getCurrentNumPois(),
                    searchResultList:[]
                };
                for(var i=0;i<resultObj.total;i++){
                    resultObj.searchResultList.push(result.getPoi(i));
                }
                var searchResult=resultObj.searchResultList;
                self.aroundInfo = [];
                searchResult.map(function (obj,count) {
                    var addresses = obj.address.split("; ");
                    var distance=parseInt(map.getDistance(point,obj['point']));
                    addresses.map(function (item, index) {
                        self.aroundInfo.push({
                            info: item + " " + obj.title,
                            line:item,
                            station:obj.title,
                            distance:distance+""
                        });
                    });
                });
                self.showAroundInfo({
                    panelSelector:'#aroundInfo',
                    dataList:self.aroundInfo
                });
            }});
        self.currentPlace.disableFirstResultSelection();//配置取消默认第一个被匹配的坐标点为中心点和气泡提示。

        //根据当前坐标点 [point] 为圆心，搜索半径为 [radius] 的附近的相关信息，搜索词为 [searchWord]
        self.currentPlace.searchNearby(searchWord,point,radius);//如果 searchWord 是多条件搜索，那就要传入数组的形式，如['地铁','公交']
    },
    showAroundInfo:function (options) {
        var self=this;
        var panelSelector=options.panelSelector;
        var dataList=options.dataList;

        //先判断周边地铁信息是否为空，如果周边没有地铁，给予相关提示
        if(!dataList.length) {
            $(panelSelector).html("<li class='text-danger'>啊!!方圆一公里没有地铁站</li>");
            !!$&&!!$("#metroInfo").length&&$("#metroInfo").val("[]");
            return;
        }
        //先按照直线距离进行排序
        dataList=dataList.sort(function (a, b) {
           return a.distance-b.distance;
        });
        //过滤去重 地铁线+地铁站 相同的数据，并清除数据内 冗余字段 key,这里key='info';
        dataList=common.compactList(dataList,'info',true);
        //如果有jquery那就用jquery方法给id和name为"metroInfo"的input标签内设置value
        !!$&&!!$("#metroInfo").length&&$("#metroInfo").val(JSON.stringify(dataList));
        //拼装信息模板
        var result=dataList.map(function (item,idx) {
                var myTime='';
                var walkingTime=item.walkingTime;//步行时间 单位为 秒
                var h=Math.floor(walkingTime/3600);
                myTime+=h>=1?h+"&nbsp;小时":"";
                var min=Math.ceil((walkingTime%3600)/60);
                myTime+=min>=1?min+"&nbsp;分钟":'';
                return '<li>距离&nbsp;<span>'+item.line+'</span>&nbsp;<span>'+item.station+'</span>&nbsp;站的直线距离约:&nbsp;<span>'+item.distance+
                    '</span>&nbsp;米;'+'</span></li>';
            });
        //将附件所有的信息内容放进信息列表模板内
        $(panelSelector).html(result.join(""));
    }
};
window.myMap=new MapController();
